import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' import dayjs from 'dayjs' import { ArrowRight, RefreshCw } from 'lucide-react' import { useEffect, useMemo, useRef, useState } from 'react' import ReportFilterBar from '@/components/interfaces/Reports/ReportFilterBar' import ReportHeader from '@/components/interfaces/Reports/ReportHeader' import ReportPadding from '@/components/interfaces/Reports/ReportPadding' import { REPORT_DATERANGE_HELPER_LABELS } from '@/components/interfaces/Reports/Reports.constants' import ReportStickyNav from '@/components/interfaces/Reports/ReportStickyNav' import { SharedAPIReport } from '@/components/interfaces/Reports/SharedAPIReport/SharedAPIReport' import { useSharedAPIReport } from '@/components/interfaces/Reports/SharedAPIReport/SharedAPIReport.constants' import { ReportChartV2 } from '@/components/interfaces/Reports/v2/ReportChartV2' import { LogsDatePicker } from '@/components/interfaces/Settings/Logs/Logs.DatePickers' import UpgradePrompt from '@/components/interfaces/Settings/Logs/UpgradePrompt' import DefaultLayout from '@/components/layouts/DefaultLayout' import ObservabilityLayout from '@/components/layouts/ObservabilityLayout/ObservabilityLayout' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { ObservabilityLink } from '@/components/ui/ObservabilityLink' import { realtimeReports } from '@/data/reports/v2/realtime.config' import { useRefreshHandler, useReportDateRange } from '@/hooks/misc/useReportDateRange' import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' import type { NextPageWithLayout } from '@/types' const RealtimeReport: NextPageWithLayout = () => { return ( ) } RealtimeReport.getLayout = (page) => ( {page} ) export type UpdateDateRange = (from: string, to: string) => void export default RealtimeReport const RealtimeUsage = () => { const [isRefreshing, setIsRefreshing] = useState(false) const { db, chart, ref } = useParams() const { selectedDateRange, updateDateRange: updateDateRangeFromHook, datePickerValue, datePickerHelpers, showUpgradePrompt, setShowUpgradePrompt, handleDatePickerChange, } = useReportDateRange(REPORT_DATERANGE_HELPER_LABELS.LAST_60_MINUTES) const queryClient = useQueryClient() const { data, error, isLoading, refetch, isRefetching, filters, addFilter, removeFilters, isLoadingData, sql, } = useSharedAPIReport({ filterBy: 'realtime', start: selectedDateRange?.period_start?.date, end: selectedDateRange?.period_end?.date, }) const chartSyncId = `realtime-${ref}` const state = useDatabaseSelectorStateSnapshot() const reportConfig = useMemo(() => { return realtimeReports({ projectRef: ref!, startDate: selectedDateRange?.period_start?.date ?? '', endDate: selectedDateRange?.period_end?.date ?? '', interval: selectedDateRange?.interval ?? 'minute', databaseIdentifier: state.selectedDatabaseId, }) }, [ref, selectedDateRange, state.selectedDatabaseId]) const onRefreshReport = useRefreshHandler( datePickerValue, datePickerHelpers, handleDatePickerChange, async () => { if (!selectedDateRange) return setIsRefreshing(true) queryClient.invalidateQueries({ queryKey: ['projects', ref, 'report-v2', { queryGroup: 'realtime' }], }) refetch() setTimeout(() => setIsRefreshing(false), 1000) } ) const urlStateHasSyncedRef = useRef(false) useEffect(() => { if (urlStateHasSyncedRef.current) return urlStateHasSyncedRef.current = true if (db !== undefined) { setTimeout(() => { // [Joshen] Adding a timeout here to support navigation from settings to reports // Both are rendering different instances of ProjectLayout which is where the // DatabaseSelectorContextProvider lies in (unless we reckon shifting the provider up one more level is better) state.setSelectedDatabaseId(db) }, 100) } if (chart !== undefined) { setTimeout(() => { const el = document.getElementById(chart) if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' }) }, 200) } }, [db, chart, state]) const updateDateRange: UpdateDateRange = (from: string, to: string) => { updateDateRangeFromHook(from, to) } return ( <>
} className="w-7" tooltip={{ content: { side: 'bottom', text: 'Refresh report' } }} onClick={onRefreshReport} /> {selectedDateRange && (

{dayjs(selectedDateRange.period_start.date).format('MMM D, h:mma')}

{dayjs(selectedDateRange.period_end.date).format('MMM D, h:mma')}

)}
} >
{selectedDateRange && reportConfig .filter((report) => !report.hide) .map((report) => ( ))}
Realtime API Gateway
) }